home *** CD-ROM | disk | FTP | other *** search
- /*
- ThinkHelpPatch.c
-
- code for the think helper patch
-
- © 1993 Steve Zellers
-
- <revision history>
- 05/15/93 smz created
- 05/20/93 smz generalized dispatches, added grep
- 08/18/93 smz first beta
- */
-
- #include <SetUpA4.h>
- #include <AppleEvents.h>
- #include "ThinkHelpPatch.h"
- #include "Exceptions.h"
- #include "PUFInterface.h"
- #include "ListTools.h"
- #include <GestaltEQU.h>
-
- typedef pascal OSErr (*AEHandlerProc)(AppleEvent* event, AppleEvent* reply);
-
- static pascal OSErr _AEHandlerProc(AppleEvent* event, AppleEvent* reply, long refcon)
- {
- OSErr err;
- AEHandlerProc pPtr = (AEHandlerProc) refcon;
-
- SetUpA4();
-
- try {
- err = (*pPtr) (event, reply);
- } catch {
- err = theException;
- }
-
- // handle any special errors we have
- switch (err) {
- case corErr: {
- static char cErrorString[] = "The target window isn't set up properly.";
- AEDesc replyDesc;
- OSErr replyErr;
-
- replyErr = AECreateDesc(typeChar, cErrorString, sizeof(cErrorString), &replyDesc);
- FailErr(replyErr);
-
- if (replyErr == noErr) {
- replyErr = AEPutParamDesc(reply, keyErrorString, &replyDesc);
- AEDisposeDesc(&replyDesc);
- }
- } break;
-
- default:
- break;
- }
-
- RestoreA4();
-
- return err;
- }
-
- static pascal OSErr _HandleGetSelection(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err = noErr;
- long selStart, selEnd;
-
- PUFGetSelection(&selStart, &selEnd);
-
- PutSelectionList(reply, selStart, selEnd);
-
- return err;
- }
-
- static pascal OSErr _HandleSetSelection(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err = noErr;
- AEDesc selList;
- long selStart, selEnd;
- long ctParams;
- DescType actualtype;
- long actualsize;
- AEKeyword actualkeyword;
-
- err = AEGetKeyDesc(event, keyDirectObject, typeAEList, &selList);
- FailErr(err);
-
- err = AECountItems(&selList, &ctParams);
- FailErr(err);
-
- if (ctParams != 2)
- throw(paramErr);
-
- err = AEGetNthPtr(
- &selList, 1, typeLongInteger, &actualkeyword, &actualtype,
- (Ptr) &selStart, sizeof(selStart), &actualsize);
- FailErr(err);
-
- err = AEGetNthPtr(
- &selList, 2, typeLongInteger, &actualkeyword, &actualtype,
- (Ptr) &selEnd, sizeof(selEnd), &actualsize);
- FailErr(err);
-
- PUFSetSelection(selStart, selEnd);
-
- return err;
- }
-
- static pascal OSErr _HandleGetFileText(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err = noErr;
- AEDesc desc;
- Handle h = PUFGetText();
- FailNil(h);
-
- desc.descriptorType = 'TEXT';
- desc.dataHandle = h;
-
- err = AEPutParamDesc(reply, keyDirectObject, &desc);
- AEDisposeDesc(&desc);
-
- return err;
- }
-
- static pascal OSErr _HandleCopySelection(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err = noErr;
- AEDesc desc;
- Handle h = PUFCopySelection();
- FailNil(h);
-
- desc.descriptorType = 'TEXT';
- desc.dataHandle = h;
- FailErr(err);
-
- err = AEPutParamDesc(reply, keyDirectObject, &desc);
- AEDisposeDesc(&desc);
-
- return err;
- }
-
- static void ExtractString(AppleEvent* event, Str255 string)
- {
- AEDesc text;
- short textLen;
- OSErr err;
-
- // extract a string from the event
- err = AEGetKeyDesc(event, keyDirectObject, typeChar, &text);
- FailErr(err);
- FailNil(text.dataHandle);
-
- textLen = GetHandleSize(text.dataHandle);
- if (textLen > 254)
- textLen = 254;
- string[0] = textLen;
- BlockMove(*text.dataHandle, &string[1], textLen);
-
- AEDisposeDesc(&text);
- }
-
- static pascal OSErr _HandleGetMarker(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err;
- Str255 markerString;
- PUFMarker marker;
- AEDesc markerList;
-
- ExtractString(event, markerString);
-
- // get the marker
- PUFGetMarkerPos(markerString, &marker);
-
- // return the marker
- MakeMarkerList(&marker, &markerList);
-
- err = AEPutParamDesc(reply, keyDirectObject, &markerList);
- AEDisposeDesc(&markerList);
-
- return err;
- }
-
- static pascal OSErr _HandleDeleteMarker(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err = noErr;
- Str255 markerString;
-
- ExtractString(event, markerString);
-
- // delete it
- PUFDeleteMarker(markerString);
-
- return err;
- }
-
- static pascal OSErr _HandleMark(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err = noErr;
- Str255 markerString;
-
- ExtractString(event, markerString);
-
- // delete it
- PUFMarkSelection(markerString);
-
- return err;
- }
-
- static pascal OSErr _HandleGetMarkers(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err;
- AEDesc returnMarkerList;
- long selStart, selEnd;
- PUFMarker marker;
-
- err = AECreateList(nil, 0, false, &returnMarkerList);
- FailErr(err);
-
- try {
- short i;
- for (i = 0; true; i++) {
- if (! PUFGetNthMarker(i, &marker))
- break;
- PushMarker(&marker, &returnMarkerList);
- }
- err = AEPutParamDesc(reply, keyDirectObject, &returnMarkerList);
- AEDisposeDesc(&returnMarkerList);
- } catch {
- AEDisposeDesc(&returnMarkerList);
- throw(theException);
- }
-
- return err;
- }
-
- static pascal OSErr _HandleCallMenu(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err;
- AEDesc textDesc;
- Str255 s;
-
- // extract a string from the event
- err = AEGetKeyDesc(event, keyDirectObject, typeChar, &textDesc);
- FailErr(err);
- FailNil(textDesc.dataHandle);
-
- s[0] = GetHandleSize(textDesc.dataHandle);
- if (s[0] > 254)
- s[0] = 254;
- BlockMove(*textDesc.dataHandle, &s[1], s[0]);
- AEDisposeDesc(&textDesc);
-
- PUFCallMenu(s);
-
- return noErr;
- }
-
- static pascal OSErr _HandleGetFSSpec(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err = noErr;
- AEDesc desc;
- FSSpec spec;
-
- PUFGetFileSpec(&spec);
-
- err = AECreateDesc(typeFSS, (Ptr) &spec, sizeof(FSSpec), &desc);
- FailErr(err);
-
- err = AEPutParamDesc(reply, keyDirectObject, &desc);
- AEDisposeDesc(&desc);
-
- return err;
- }
-
- static pascal OSErr _HandlePasteText(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err;
- AEDesc textDesc;
-
- // extract a string from the event
- err = AEGetKeyDesc(event, keyDirectObject, typeChar, &textDesc);
- FailErr(err);
- FailNil(textDesc.dataHandle);
-
- try {
- PUFPasteText(textDesc.dataHandle);
- AEDisposeDesc(&textDesc);
- } catch {
- AEDisposeDesc(&textDesc);
- throw(theException);
- }
-
- return noErr;
- }
-
- static pascal OSErr _HandleMoveWin(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err;
- DescType actualType;
- Size actualSize;
- Point pWhere, pSize;
-
- err = AEGetParamPtr(event, 'whre', 'QDpt', &actualType, (Ptr) &pWhere, sizeof(Point), &actualSize);
- FailErr(err);
-
- err = AEGetParamPtr(event, 'size', 'QDpt', &actualType, (Ptr) &pSize, sizeof(Point), &actualSize);
- FailErr(err);
-
- PUFZoomWindow(pWhere, pSize);
-
- return err;
- }
-
- static pascal OSErr _HandleGetWinPos(AppleEvent* event, AppleEvent* reply)
- {
- OSErr err;
- WindowPtr w;
- Rect r;
-
- w = FrontWindow();
- if (w == nil)
- throw(corErr);
-
- // r = w->portBits.bounds;
- r = (**((WindowPeek) w)->strucRgn).rgnBBox;
- err = AEPutParamPtr(reply, keyDirectObject, 'qdrt', (Ptr) &r, sizeof(Rect));
- FailErr(err);
-
- return err;
- }
-
- static void InstallHandler(OSType msg, AEHandlerProc proc)
- {
- AEInstallEventHandler(cEventClass, msg, _AEHandlerProc, (long) proc, false);
- }
-
- void main()
- {
- long result;
-
- RememberA0();
- SetUpA4();
-
- if (Gestalt(gestaltSystemVersion, &result) == noErr && result >= 0x0700) {
- InstallHandler(cGetSelection, _HandleGetSelection);
- InstallHandler(cSetSelection, _HandleSetSelection);
- InstallHandler(cGetText, _HandleGetFileText);
- InstallHandler(cCopySelection, _HandleCopySelection);
- InstallHandler(cCallMenu, _HandleCallMenu);
- InstallHandler(cGetWindowSpec, _HandleGetFSSpec);
- InstallHandler(cMoveWindow, _HandleMoveWin);
- InstallHandler(cGetWinPos, _HandleGetWinPos);
-
- InstallHandler(cGetMarker, _HandleGetMarker);
- InstallHandler(cGetAllMarkers, _HandleGetMarkers);
- InstallHandler(cDeleteMarker, _HandleDeleteMarker);
- InstallHandler(cPasteText, _HandlePasteText);
- InstallHandler(cMarkSelection, _HandleMark);
-
- InstallPUFPatches();
- }
-
- RestoreA4();
- }
-